Imports System.Net.Sockets
Imports System.Data.SqlClient
Imports System.Threading


Public Class Cliente

    Private ID As Integer
    Private Nome As String
    Public Aplicativos_Instalados As List(Of Aplicativo)
    Public Aplicativos_Desejados As List(Of Aplicativo)
    Public Perfis As List(Of Perfil)
    Public Lista_Aplicativos_Completa As Boolean
    Public socket As System.Net.Sockets.TcpClient
    Public aguardando_resposta As Boolean

    Public Sub New()
        Me.Lista_Aplicativos_Completa = False
        Me.Aplicativos_Instalados = New List(Of Aplicativo)
        Me.Aplicativos_Desejados = New List(Of Aplicativo)
        Me.Perfis = New List(Of Perfil)
        Me.aguardando_resposta = False

    End Sub

    Public Shadows Sub Finalize()

        If Me.socket.Connected Then
            Me.socket.Close()
        End If

    End Sub

    Public Sub New(ByVal strID As Integer, ByVal strNome As String)
        Me.ID = strID
        Me.Nome = strNome
        Me.Lista_Aplicativos_Completa = False
        Me.aguardando_resposta = False
        Me.Aplicativos_Instalados = New List(Of Aplicativo)
        Me.Aplicativos_Desejados = New List(Of Aplicativo)
        Me.Perfis = New List(Of Perfil)

        Me.get_Perfis()

        Me.get_Aplicativos_instalados()

    End Sub

    Public Function getNome() As String
        Return Nome
    End Function
    Public Function setNome(ByVal inNome As String)
        Try
            Nome = inNome
            If Perfis.Count = 0 Then
                get_Perfis()
            End If
            Me.get_Aplicativos_instalados()
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

    Public Function getID() As Integer
        Return ID
    End Function
    Public Function setID(ByVal inID As Integer) As Boolean
        Try
            ID = inID
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

    Private Sub AdicionaAplicativo(ByVal inAp As String, ByVal inVersao As String)
        Dim a As Aplicativo
        a = New Aplicativo(inAp, inVersao)
        Me.Aplicativos_Instalados.Add(a)
    End Sub

    Public Sub TrataMensagem(ByVal msg As String)
        Select Case msg.Substring(0, 1)

            Case "1" 'Aplicativos instalados
                Dim aplicativo, versao As String
                aplicativo = Trim(msg.Substring(1, msg.LastIndexOf("-") - 1))
                versao = Trim(msg.Substring(msg.LastIndexOf("-") + 1, msg.Length - msg.LastIndexOf("-") - 1))
                AdicionaAplicativo(aplicativo, versao)

            Case "/" 'Fim da lista de aplicativos
                Me.Lista_Aplicativos_Completa = True
                Comunicacao.Log_Mensagem("Cliente " + Me.getNome + " : Lista de aplicativos completa")
                Me.aguardando_resposta = False

            Case "\" 'Sucesso ao executar comando
                Comunicacao.Log_Mensagem("Cliente " + Me.getNome + " : [SUCESSO] " + msg.Substring(1, msg.Length - 1))
                Me.aguardando_resposta = False

            Case "-" 'Falha ao executar comando
                Comunicacao.Log_Mensagem("Cliente " + Me.getNome + " : [ERRO] " + msg.Substring(1, msg.Length - 1))
                Me.aguardando_resposta = False
            Case Else
        End Select
    End Sub


    Public Function str_Aplicativos_Instalados() As List(Of String)
        Dim l As New List(Of String)
        Dim a As Aplicativo

        For Each a In Aplicativos_Instalados
            l.Add(a.ToString)
        Next

        Return l
    End Function

    Public Function get_Aplicativos_instalados() As List(Of Aplicativo)
        Me.Lista_Aplicativos_Completa = False
        Comunicacao.Log_Mensagem("Solicitando lista de Aplicativos instalados para " + Me.getNome)
        Comunicacao.EnviarMensagem(Me, "1", True)
        Return Me.Aplicativos_Instalados
    End Function

    Public Shared Function get_Cliente(ByVal inNome As String) As Cliente
        Dim c As Cliente = Nothing
        Dim Item As DictionaryEntry

        For Each Item In Comunicacao.listaClientes
            c = Item.Value
            If c.getNome = inNome Then
                Exit For
            End If
        Next

        Return c
    End Function

    Public Sub get_Perfis()

        Dim ta As New sigeapDataSetTableAdapters.PerfisTableAdapter
        Dim ds As New sigeapDataSet
        Dim p As sigeapDataSet.PerfisRow

        ta.FillByMaquina(ds.Perfis, Me.getNome)

        For Each p In ds.Perfis

            Dim perfil As Perfil
            perfil = New Perfil(p.Nome)
            Perfis.Add(perfil)

            Dim a As Aplicativo
            For Each a In perfil.Aplicativos_Desejados
                Me.Aplicativos_Desejados.Add(a)
            Next

        Next

    End Sub

    Public Function Instalar_Aplicativos_Faltando()
        Dim a As Aplicativo
        Dim falta_aplicativo As Boolean = False
        Dim Aplicativos_Faltantes As New List(Of Aplicativo)

        For Each a In Aplicativos_Desejados
            If Not Aplicativos_Instalados.Contains(a) Then
                Aplicativos_Faltantes.Add(a)
                falta_aplicativo = True
            End If
        Next

        If falta_aplicativo Then
            For Each a In Aplicativos_Faltantes
                a.Instalar(Me)
            Next

            Thread.Sleep(100)
        End If

        Return falta_aplicativo

    End Function
End Class
